/*
 * Copyright (c) 2022, Chongqing UCchip InfoTech Co.,Ltd
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2023-12-22     jlu          the first version
 */
#ifndef _NET_PROT_H_
#define _NET_PROT_H_

#include "config_data.h"
#include "config_boot.h"
#include "interaction_manager.h"

#define PROT_VERSION           "v2.0" // 协议版本号
#define PROT_SET_CONFIG        2      // 设置配置
#define PROT_QUERY_CONFIG      3      // 查询配置
#define PROT_EXEC_CONFIG       4      // 执行配置
#define PROT_OTA_UPDATE        5      // OTA 升级
#define PROT_OTA_UPDATE_CMP    6      // 终端OTA升级完成
#define PROT_SCAN_FREQ_REQ     7      // 网关扫描频点请求
#define PROT_IOTE_STATE        20     // 终端状态
#define PROT_USER_DATA         100    // 用户数据
#define PROT_LOOP_DATA         101    // 回环数据，终端收到后会返回该数据
#define PROT_IOTE_VERSION_REQ  150    // 终端版本号查询
#define PROT_TRANSPARENT_DATA  200    // 透传数据（rs485）
#define PROT_DEVICE_STATUS     201    // 设备状态

/**
 * @brief 连续信号唤醒并发送数据结构体
 *
 */
typedef struct
{
    wiota_paging_tx_cfg_t *paging_tx;
    net_dl_userdata_t *user_data;
} wiota_paging_tx_and_data_t;

/**
 * @brief 网络配置参数结构体
 *
 */
typedef struct
{
    wiota_sys_cfg_t *sys_cfg;
    wiota_act_cfg_t *act_cfg;
    wiota_freq_cfg_t *freq_cfg;
    wiota_power_cfg_t *power_cfg;
    wiota_rate_cfg_t *rate_cfg;
    wiota_paging_tx_and_data_t *paging_tx_cfg;
    wiota_sync_paging_cfg_t *sync_paging_cfg;
    wiota_ts_cfg_t *ts_cfg;
    wiota_subf_mode_cfg_t *subf_cfg;
    gw_base_cfg_t *base_cfg;
    gw_auth_cfg_t *auth_cfg;
    gw_id_manager_cfg_t *id_mng_cfg;
    gw_net_policy_cfg_t *net_policy_cfg;
    gw_net_if_cfg_t *net_if_cfg;
    gw_wifi_cfg_t *wifi_cfg;
    gw_cat1_cfg_t *cat1_cfg;
    gw_bt_cfg_t *bt_cfg;
    gw_mqtt_server_cfg_t *mqtt_server_cfg;
    gw_data_cfg_t *data_cfg;
    gw_wtd_cfg_t *wtd_cfg;
    gw_ftp_log_cfg_t *log_cfg;
    gw_log_switch_cfg_t *log_switch_cfg;
    gw_uart_485_cfg_t *uart_485_cfg;
    gw_timed_cfg_t *timed_cfg;

    sync_cfg_t *sync_cfg;

    slot_send_cfg_t *slot_send_cfg;

    uboot_cfg_t *uboot_cfg;
    unsigned int *immediate_effective_cfg;
} net_cfg_set_t;

/**
 * @brief 网络查询参数结构体
 *
 */
typedef struct
{
    char query[32];
} net_cfg_query_t;

/**
 * @brief 网络执行参数结构体
 *
 */
typedef struct
{
    char exec[32];
} net_cfg_exec_t;

#ifdef __cplushplus
extern "C"
{
#endif

/**
 * @brief  解析主题 ID
 *
 * @param  p 输入字符串指针
 * @param  len 输入字符串长度
 * @return 返回主题 ID
 */
int parse_topic_id(const char *p, int len);

/**
 * @brief  编码网关所有配置信息
 *
 * @return char* 成功返回编码结果，否则返回 RT_NULL
 */
char *encode_gateway_all_cfg(void);

/**
 * @brief  编码 IoTE 状态
 *
 * @param  state IoTE 状态
 * @return 成功返回编码结果，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char* encode_iote_state(const void *state);

/**
 * @brief  编码终端版本号查询响应
 *
 * @param  iote_ver IoTE版本
 * @return 成功返回编码结果，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char *encode_iote_version_response(const void *iote_ver);

/**
 * @brief  编码用户数据
 *
 * @param  user_data 用户数据
 * @return 成功返回编码结果，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char* encode_user_data(const void *user_data);

/**
 * @brief  编码 WIoTa 版本
 *
 * @param  ver WIoTa 版本
 * @return 成功返回编码结果，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char *encode_wiota_version(const void *ver);

/**
 * @brief  编码 WIoTa 配置
 *
 * @param  cfg WIoTa 配置
 * @return 成功返回编码结果，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char* encode_wiota_sys_cfg(const void *cfg);

/**
 * @brief  编码 WIoTa 连接态时间
 *
 * @param  cfg WIoTa 连接态时间
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char* encode_wiota_act_cfg(const void *cfg);

/**
 * @brief  编码 WIoTa 频点列表
 *
 * @param  cfg WIoTa 频点列表
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char* encode_wiota_freq_cfg(const void *cfg);

/**
 * @brief  编码 WIoTa 发射功率
 *
 * @param  cfg WIoTa 发射功率
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char* encode_wiota_power_cfg(const void *cfg);

/**
 * @brief  编码 WIoTa 速率模式
 *
 * @param  cfg WIoTa 速率模式
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char* encode_wiota_rate_cfg(const void *cfg);

/**
 * @brief  编码 WIoTa 连续信号唤醒配置
 *
 * @param  cfg WIoTa 连续信号唤醒配置
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char *encode_wiota_paging_tx_cfg(const void *cfg);

/**
 * @brief  编码 WIoTa 周期信号唤醒配置
 *
 * @param  cfg WIoTa 周期信号唤醒配置
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char *encode_wiota_sync_paging_cfg(const void *cfg);

/**
 * @brief  编码 WIoTa 授时配置
 *
 * @param  cfg WIoTa 授时配置
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char* encode_wiota_ts_cfg(const void *cfg);

/**
 * @brief  编码 WIoTa 子帧模式配置
 *
 * @param  cfg WIoTa 子帧模式配置
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char *encode_wiota_subf_mode_cfg(const void *cfg);

/**
 * @brief  编码分时发送
 *
 * @param  cfg 分时发送
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char* encode_slot_send_cfg(const void *cfg);

/**
 * @brief  编码Ymodem等待时间
 *
 * @param  time 等待时间
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char *encode_uboot_cfg(const void *time);

/**
 * @brief  编码uboot配置
 *
 * @param  cfg uboot配置
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char *encode_immediate_effective_cfg(const void *cfg);

/**
 * @brief  编码立即生效配置
 *
 * @param  cfg 立即生效配置
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char *encode_factory_test_result_cfg(const void *cfg);

/**
 * @brief  编码网关基础配置
 *
 * @param  cfg 网关基础配置
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char *encode_gateway_base_cfg(const void *cfg);

/**
 * @brief  编码网关ID管理配置
 *
 * @param  cfg 网关ID管理配置
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char *encode_gateway_id_mng_cfg(const void *cfg);

/**
 * @brief  编码鉴权信息
 *
 * @param  cfg 鉴权信息
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char* encode_gateway_auth_cfg(const void *cfg);

/**
 * @brief  编码网络配置
 *
 * @param  cfg 网络配置
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char* encode_gateway_net_cfg(const void *cfg);

/**
 * @brief  编码网卡策略配置
 *
 * @param  cfg 网卡策略配置
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char *encode_gateway_net_policy_cfg(const void *cfg);

/**
 * @brief  编码网口配置
 *
 * @param  cfg 网口配置
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char *encode_gateway_net_if_cfg(const void *cfg);

/**
 * @brief  编码 WIFI 配置
 *
 * @param  cfg WIFI 配置
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char *encode_gateway_wifi_cfg(const void *cfg);

/**
 * @brief  编码cat1配置
 *
 * @param  cfg cat1配置
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char *encode_gateway_cat1_cfg(const void *cfg);

/**
 * @brief  编码 蓝牙 配置
 *
 * @param  cfg 蓝牙 配置
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char *encode_gateway_bt_cfg(const void *cfg);

/**
 * @brief  编码 MQTT 服务器
 *
 * @param  cfg MQTT 服务器
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char* encode_gateway_mqtt_cfg(const void *cfg);

/**
 * @brief  编码 WIFI 配置
 *
 * @param  cfg WIFI 配置
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char *encode_gateway_wifi_cfg(const void *cfg);

/**
 * @brief  编码上下行数据编码配置
 *
 * @param  cfg 上行数据编码配置
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char *encode_gateway_data_cfg(const void *cfg);

/**
 * @brief  编码看门狗
 *
 * @param  cfg 看门狗
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char* encode_gateway_wtd_cfg(const void *cfg);

/**
 * @brief  编码LOG配置
 *
 * @param  cfg LOG配置
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char *encode_gateway_ftp_log_cfg(const void *cfg);

/**
 * @brief  编码LOG口切换配置
 *
 * @param  cfg LOG口切换配置
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char *encode_gateway_log_switch_cfg(const void *cfg);

/**
 * @brief  编码uart_485配置
 *
 * @param  cfg uart_485配置
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char *encode_gateway_uart_485_cfg(const void *cfg);

/**
 * @brief  编码网关定时重启配置
 *
 * @param  cfg 网关定时重启配置
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char *encode_gateway_timed_cfg(const void *cfg);

/**
 * @brief  编码485透传数据
 *
 * @param  data 485透传数据
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char *encode_transparent_data(const void *transparent_data);

/**
 * @brief  编码设备状态
 *
 * @param  status 设备状态
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char *encode_device_status(const void *status);

 /** @brief  编码同步助手配置
 *
 * @param  cfg 同步助手配置
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char *encode_sync_cfg(const void *cfg);

/**
 * @brief 编码终端OTA升级完成消息
 *
 * @param cmp_info 升级完成消息
 * @return char* 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char *encode_ota_upgrade_complete_info(const void *cmp_info);

/**
 * @brief  编码鉴权列表信息
 *
 * @param  auth_info 鉴权列表信息
 * @param  is_over   发送完成标志
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char *encode_gateway_auth_list(const void *auth_info, int *is_over);

/**
 * @brief  编码扫频响应信息
 *
 * @param  scan_resp 扫频响应信息
 * @param  is_over   发送完成标志
 * @return 成功返回编码对象，否则返回 RT_NULL
 * @note   编码结果需使用 rt_free 释放
 */
char *encode_gateway_scan_resp(const void *scan_resp, int *is_over);

/**
 * @brief  解析升级信息
 *
 * @param  obj JSON 对象
 * @param  key 键值
 * @return 升级信息
 */
void *parse_ota_update(const cJSON *obj);

/**
 * @brief  解析设置配置
 *
 * @param  obj JSON 对象
 * @return 配置
 */
void *parse_set_config(const cJSON *obj);

/**
 * @brief  解析查询配置
 *
 * @param  obj JSON 对象
 * @return 配置命令
 */
int parse_query_config(const cJSON *obj);

/**
 * @brief  解析执行配置
 *
 * @param  obj JSON 对象
 * @return 配置命令
 */
int parse_exec_config(const cJSON *obj);

/**
 * @brief  解析用户数据
 *
 * @param  root JSON 对象
 * @return 成功返回用户数据指针，否则返回 NULL
 */
void *parse_user_data(const cJSON *root);

/**
 * @brief  解析透传数据
 *
 * @param  root JSON 对象
 * @return 成功返回用户数据指针，否则返回 NULL
 */
void *parse_transparent_data(const cJSON *root);

/**
 * @brief  解析扫描频点请求
 *
 * @param root   JSON 对象
 * @return void* 成功返回扫描频点请求指针，否则返回 RT_NULL
 */
void *parse_scan_freq_request(const cJSON *root);

/**
 * @brief  编码同步动态信息
 *
 * @param dynamics_info 同步动态信息
 * @return char*        成功返回编码对象，否则返回 RT_NULL
 */
char *encode_sync_dynamics_info(const void *dynamics_info);

#ifdef __cplushplus
}
#endif // __cplushplus

#endif // _NET_PROT_H_
